package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	str := []byte("abc一二三def中gh五")
	fmt.Printf("%s", reverse(str))
}

func reverse(str []byte) []byte {
	// 把每个rune字符转置，再把整个slice转置，则确保了所有rune仍然是正确的顺序，而所有rune字符都转置了
	for i := 0; i < len(str); {
		_, size := utf8.DecodeRune(str[i:])
		rec(str[i : i+size])
		i += size
	}
	rec(str[:])
	return str
}

// 把一个字节切片转置
func rec(str []byte) {
	size := len(str)
	for i := 0; i < size/2; i++ {
		str[i], str[size-i-1] = str[size-i-1], str[i]
	}
}
